import fs from 'node:fs'
import fs2 from 'node:fs/promises'
import express from 'express'
import path from 'node:path'

const router = express.Router() //路由模块
const TXT = `./public/index.txt`
// fs的源码是通过 C++ 层的 FSReqCallback 这个类 对libuv 的uv_fs_t 的一个封装，其实也就是将我们fs 的参数透传给 libuv 层
// fs.mkdir 是 Node.js 的一个方法，用于创建目录。
// fs.writeFile 或 fs.outputFile文件
router.get('/readFile/promises', (req, res) => {
  //读取文件
  fs2.readFile(`${TXT}`).then(result => {
    console.log(result.toString())
    res.send({
      val: result.toString(),
    })
  })
})
router.get('/readFile', (req, res) => {
  //读取文件
  fs.readFile(`${TXT}`, (err, data) => {
    if (err) {
      return err
    }
    res.send({
      val: data.toString(),
    })
  })
})

/* 增加了Sync fs 就会采用同步的方式运行代码.不加Sync就是异步的模式不会阻塞。 */
router.get('/readFileSync', (req, res) => {
  //同步读取文件
  let txt = fs.readFileSync(`${TXT}`)
  console.log(txt.toString())
  res.send({
    val: txt.toString(),
  })
})

/* 第二个配置项 */
router.get('/readFile/encoding', (req, res) => {
  //同步读取文件
  fs2
    .readFile(`${TXT}`, {
      encoding: 'utf8',
      flag: '',
    })
    .then(result => {
      console.log(result.toString())
      res.send({
        val: result.toString(),
      })
    })
})
/* 使用可读流读取 使用场景适合读取大文件 */
router.get('/readFile/createReadStream', (req, res) => {
  let chunks = []
  const readStream = fs.createReadStream(`${TXT}`, {
    encoding: 'utf8',
  })

  readStream.on('data', chunk => {
    console.log('chunk', chunk)
    chunks.push(chunk)
    res.send({
      val: chunks,
    })
  })

  readStream.on('end', () => {
    console.log('close')
    console.log('chunks', chunks)
  })
})
/* 创建目录，如果开启 recursive 可以递归创建多个文件夹 */
router.get('/mkdir', (req, res) => {
  fs.mkdir('./test/ccc', { recursive: true }, err => {
    console.log('Error creating', err)
  })
  res.send('mkdir ok')
})
/* 删除目录 */
router.get('/rm', (req, res) => {
  fs.rm('./test', { recursive: true }, err => {})
  res.send('rm ok')
})
/* 重命名目录 */
router.get('/renameSync', (req, res) => {
  fs.renameSync('./test/ccc', './test/ccc2')
  res.send('renameSync ok')
})

/* 创建文件（.后缀） */
router.get('/writeFile', (req, res) => {
  fs.writeFile(path.join('./test/ccc2', 'aa.txt'), '', err => {
    if (err) throw err
    console.log('File has been saved!')
  })
  res.send('writeFile ok')
})

/* 监听变化 */
router.get('/watch', (req, res) => {
  fs.watch('./test/ccc2/a.txt', (event, filename) => {
    console.log(event, filename)
  })
  res.send('watch ok')
})
/* fs--写--下 */
router.get('/writeFileSync', (req, res) => {
  fs.writeFileSync('./test/ccc2/a.txt', 'good ', {
    flag: 'a',
  })
  res.send('writeFileSync ok')
})

router.get('/appendFileSync', (req, res) => {
  fs.appendFileSync('./test/ccc2/a.txt', '\n node \n express')
  res.send('appendFileSync ok')
})

/*可写流， 没有会创建 */
router.get('/createWriteStream', (req, res) => {
  let verse = ['待到秋来九月八', '我花开后百花杀', '冲天香阵透长安', '满城尽带黄金甲']

  let writeStream = fs.createWriteStream('./test/ccc2/cc.txt')

  verse.forEach(item => {
    writeStream.write(item + '\n')
  })

  writeStream.end()

  writeStream.on('finish', () => {
    console.log('写入完成')
    res.send('appendFileSync ok')
  })
})
// 硬链接文件共享，文件备份
// 软链接可以用于创建快捷方式或别名
router.get('/linkSync', (req, res) => {
  fs.linkSync('./test/ccc2/linkSync.txt', './test/ccc2/linkSync1.txt') //硬链接
  res.send('linkSync ok')
})
/* 
ls -l example.txt
chmod 777 example.txt
如果你希望在符号链接已存在时覆盖它，可以使用 fs.symlink()
方法而不是 fs.symlinkSync()。fs.symlink() 方法是异步的，
*/
router.get('/symlinkSync', (req, res) => {
  const sourcePath = path.resolve('./test/ccc2/symlinkSync.txt')
  const linkPath = path.resolve('./test/ccc2/symlinkSync1.txt')
  console.log(sourcePath, fs.existsSync(sourcePath))
  // symlink symlinkSync有误
  // fs.symlinkSync('./test/ccc2/symlinkSync.txt', './test/ccc2/symlinkSync1.txt', ) //软连接
  fs.symlink(sourcePath, linkPath, () => {
    console.log('符号链接已成功创建')
  })
  res.send('linkSync ok')
})
export default router
